• פוסטים
  • פורום

תכנות מונחה עצמים בג'אווה סקריפט

fingerbang,
 15 לאוגוסט 2011
תכנות מונחה עצמים בג'אווה סקריפט



בג'אווה סריפט אין מחלקות, יש אובייקטים.
כדי ליצור אובייקט חדש שימש לנו כמו מחלקה נעשה ככה:
function obj() {
}

נוכל ליצור מופע של האובייקט בקריאה פשוטה לפונקציה
var obj1 = obj();

ונוכל(לרוב עדיף, יוסבר בהמשך) להשתמש במילה השמורה new:
var obj2 = new obj();


בג'אווה סקריפט איו בנאי(קונסטראקטור). כאשר אנחנו יוצרים מופע חדש אנחנו מפעילים את תוכן הפונקציה. אפשר לאמר שהיא הבנאי של עצמה.
אם נרצה להעביר לאובייקט פרמטרים שהוא "יבנה את עצמו" איתם פשוט נעביר פרמטרים לפונקציה.
var obj3 = new obj("smothing to start with.");

משתנים


כדי להגדיר משתנים לאובייקט נוכל לעשות ככה:
function obj() {
  var x = 5;
}

ונוכל להשתמש בערך this שמצביע לטווח שבו אנחנו נמצאים
function obj() {
  this.x = 5;
}

נגיד ויש לנו את הסקריפט הבא
var x = 1;
function obj() {
  var x = 5;
}
function this_obj() {
  this.x = 5;
}

כאשר אנחנו נפעיל את obj באותו טווח עם x. הפונקציה תיצור לעצמה משתנה בשם x ולא תדרוס את המשתנה x שבטווח שלנו. כלומר
obj();
alert(x);

יציג לנו 1.
אבל אם נפעיל את this_obj באותו טווח עם x. הפונקציה תלך לטווח עצמו ותיצור\תשנה את x שם. כלומר
this_ibj();
alert(x);

יציג לנו 5.

אם אנחנו נכתוב פונקציה שתשתמש במילה this אז נצטרך להפעיל אותה דרך new. שימו לב שאתם תקבלו אובייקט ולא תהיה שום השפעה על הטווח שאתם נמצאים בו.
לדוגמה:
function nt() {
  this.rly = true;
}
new nt();

לא תהיה שגיאה, אבל זה לא יעשה משהו שימושי(לא יווסף ערך בשם rly בטווח). לכן אנחנו "נלכוד" את הפלט בערך.
var obj2 = new obj();


מתודות.


יצירת מתודות זהה להגדרת משתנים, בגלל שבג'אווה סקריפט פונקציות הן אובייקטים.
function obj() {
  ver met = function() {
    ..
  };
}

השתמשתי בפונקציה אנונימית בגלל שאין לנו צורך בשם.
בג'אווה בקריפט אין העמסת פרמטרים. לא נוכל לעשות ככה
function obj() {
  var meth = function(single) {
    ..
  };
  meth = function(more, then, one) {
    ..
  };
}

ואפשר להבין בקלות גם למה אין העמסת פרמטרים.
בג'אווה סקריפט אנחנו לא נוכל להגביל שימוש בפרמטרים או מתודות. אין לנו private/public.

בג'אווה סקריפט לכל אובייקט יש אל טיפוס, הprototype שלו. את האב טיפוס אפשר לשנות בזמן ריצה. הוא לא סטטי. הprototype הוא אובייקט אחר.
כברירת מחדל הprototype של האובייקט יהיה האובייקט Object אבל אפשר לשנות את זה בקלות.
נתחיל עם אובייקט פשוט של נקודה.
function point() {
  this.x = 0;
  this.y = 0;
}

ועכשיו ניצור נקודה יותר מתקדמת.
function a3DPoint() {
  this.z = 0;
  this.showcords = function() {
    return "(" + this.x + "," + this.y + "," + this.z + ")";
  };
}

וכדי לקשר את האב טיפוס נעשה ככה(מחוץ לפונקציה)
a3DPoint.prototype = new point;

(אם אין פרמטרים אפשר להוריד את הסוגריים.)
שימו לב שהנקודה המתקדמת שלנו "תירש" גם את המאפיינים של האב טיפוס של הנקודה שלנו. אפשר לייצג את זה בשרשרת.
a3DPoint(z, showcords)
|
point(x, y)
|
Object

ג'אווה סקריפט תחפש את הערך או המתודה בשרשרת עד שהיא תמצא אותה ותיעצר.
כדי להגיע לz היא תחפש ב3DPoint ותיעצר.
כדי להגיע לx היא תחפש ב3DPoint, היא לא תמצא כלום ואז היא תחפש אותו בpoint ותיעצר.

בגלל זה אנחנו יכולים לדרוס פונקציות וערכים. אם יש לנו את השרשרת הזאת
obj(a, b)
|
sub(a, c)

כדי להגיע לc ג'אווה סקריפט תחפש בobj, היא לא תמצא כלום ואז היא תמשיך לsub.
אבל כדי להגיע לa ג'אווה סקריפט תחפש בobj, תמצא ותיעצר. היא לא תמשיך לsub.


fingerbang fingerbang

תגובות לכתבה:

raslin  16/08/2011 22:44
מדריך מעולה :)
intval  16/08/2011 23:25
מדהים.
ההסבר מצוין וברור. חידש לי על מהות ה new שאף פעם לא הבנתי בשביל מה הוא. תודה רבה.

אגב, אני נזכר במדריך הקודם
( http://phpguide.co.il/javascript_scopes_objects_functions.htm )
והאפשרות של שימוש ב call/apply הם עוד סיבה מצוינת להגדיר מאפיינים של אובייקט עם var x = 1 ולא this.x = 1
objet  17/08/2011 19:06
תודה אהבתי.
אנונימי  17/10/2011 22:45
מדריך מצוין שמאוד עזר לי להבין מה זה prototype!
ספר חינם על MVC שאתה הולך להוריד כי אם אתה רוצה ללמוד על ארגון קוד יעיל ומודרני באתרים כמו זה או פייסבוק או כי כולם אוהבים להוריד דברים איכותיים בחינם מהאינטרנט

ספר הלימוד - תכנות מונחה עצמים מאפס שסוף סוף ילמד אותך פיתוח מונחה עצמים נכון בצורה פשוטה, יענה על כל השאלות ויכין אותך לרעיונות עבודה.

קורס בדיקות יחידה phpunit שיעזור לך להקטין בחצי את כמות הבאגים, את כאב הראש והזמן המבוזבז על פתירתם

קורס mysql אינטרקטיבי שיייקח אותך צעד אחר צעד למומחה שאילתות mysql לייב


האתר ב-readonly
תודה לכל מי שתרם, ענה, שאל, כתב, לימד ועזר במשך השנים
orelbey, splash, raslin, cayce, iiddaannyy, michael, kingyes, ilikeme, itamarhadad, iosolidar, jbstyle
- alex@הדומיין הזה